﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once
#include "GcmpModelInterface.h"

namespace gcmp
{
    //class ElementId;

    /// \brief 报告对容器做NDB拷贝时，哪些元素需要跟着一起拷贝
    ///
    /// 假设容器C1内包含了元素{A1，B1}，容器C2中包含了元素{A2，B2}
    /// 2. 报告A1为copy：在更新C2时，对A2进行Ndb拷贝，源对象为A1。
    /// 3. 报告B1为keep：在更新C2时，B2不变。
    /// \note 此处的Group是容器的意思，并不单指成组功能
    class GCMP_MODEL_INTERFACE_EXPORT INdbCopyStrategyReporter
    {
    public:
        /// \brief 创建空的拷贝策略报告器
        /// \return 返回创建出的拷贝策略报告器
        static OwnerPtr<INdbCopyStrategyReporter> Create();

        /// \brief 报告为拷贝
        /// \param srcElementId 做Ndb拷贝时的源对象的ElementId
        /// \param targetElementId 做Ndb拷贝时的目标对象的ElementId
        /// \return void
        virtual void ReportToCopy(const ElementId srcElementId, const ElementId targetElementId) = 0;

        /// \brief 报告为保持
        /// \param srcElementId 做Ndb拷贝时的源对象的ElementId
        /// \param targetElementId 做Ndb拷贝时的目标对象的ElementId
        /// \return void
        virtual void ReportToKeep(const ElementId srcElementId, const ElementId targetElementId) = 0;

        /// \brief 获取所有报告为拷贝的Elements的Id，key为源对象的ElementId，value为目标对象的ElementId
        /// \return const std::map<ElementId, ElementId>&
        virtual const std::map<ElementId, ElementId>& GetIdsToCopy(void) const = 0;

        /// \brief 获取所有报告为保持的Elements的Id，key为源对象的ElementId，value为目标对象的ElementId
        /// \return const std::vector<gcmp::ElementId>&
        virtual const std::map<ElementId, ElementId>& GetIdsToKeep(void) const = 0;

        /// \brief 不报告为拷贝
        /// \param elementId 目标对象的ElementId
        /// \return void
        virtual void DoNotReportToCopy(const ElementId & elementId) = 0;

        /// \brief 不报告为保持
        /// \param elementId 目标对象的ElementId
        /// \return void
        virtual void DoNotReportToKeep(const ElementId & elementId) = 0;

    public:
        /// \brief 析构函数
        virtual ~INdbCopyStrategyReporter() {}
    };

};


